var $_={};  //用于保存一些常用的全局变量
$_.includes={};  //包含了哪些文件
$_.debug=false;  //是否是调试模式
$_.base="";  //存放JS文件的文件夹路径
$_.lang="cn";  //当前语言设置
$_.contextPath="";  //布署应用的路径
$_.topLayer=100;  //最上层

//区分不同的浏览器
if(navigator.userAgent.indexOf("MSIE")>0)
{
	$_.IE=true;

	//取版本信息
	var str=navigator.userAgent;
	var s=str.indexOf("MSIE")+4;
	var l=str.indexOf(";",s)-s;
	if(l>0)
		$_.V=parseFloat(str.substr(s,l));
}
else if(navigator.userAgent.indexOf("Firefox")>0)
{
	$_.FF=true; 

	var str=navigator.userAgent;
	var s=str.indexOf("Firefox")+8;
	var l=str.indexOf(" ",s)-s;
	if(l<0) l=str.length;
	$_.V=parseFloat(str.substr(s,l));
} 
else if(navigator.userAgent.indexOf("Opera")>0)
{
	$_.OE=true;

	var str=navigator.userAgent;
	var s=str.indexOf("Opera")+6;
	var l=str.indexOf(" ",s)-s;
	if(l<0) l=str.length;
	$_.V=parseFloat(str.substr(s,l));
}
else if(navigator.userAgent.indexOf("Safari")>0)
{
	$_.SF=true;
}
else
	$_.UB=true;  //Unknowable Browser

if($_.debug)
{
	document.write("<textarea name=\"$_.debugArea\" id=\"$_.debugArea\" style='width:100%; height:100; font-size:12px;'></textarea><hr>");
}

function $debug(msg)
{
	if($_.debug)
	{
		var area=document.getElementById("$_.debugArea");
		if(area!=null) area.value="[Debug] "+msg+"\n"+area.value;
		else alert("[Debug] "+msg);
	}
}

function $error(msg)
{
	alert("[Error]"+msg);
}

function $info(msg)
{
	//window.status=msg;
	alert(msg);
}

/* 用于加载外部文件
path是相对于$_.base的路径
*/
function $include(path)
{
	if(!(path.indexOf('.')==0))
	{
		if(path.indexOf('/')==0) path=$_.contextPath+path;
		else path=$_.base+path;  //构造完整的路径
	}

	//如果没有加载过
	if($_.includes[path]==null)
	{
		if(path.indexOf(".css")>-1)
			document.write("<link rel=stylesheet href=\""+path+"\" type=\"text/css\">");	//加载CSS文件
		else
			document.write("<script type=\"text/javascript\" src=\""+path+"\"></script>");  //加载JS文件
		$_.includes[path]=true;
		$debug("Include file : "+path);
	}
}

//初始化$_.base的值
function $setupBase()
{
	var libFileName="js/frame.js";
	var scripts=document.getElementsByTagName("script");
	for(var i=0;i<scripts.length;i++)
	{
		if(scripts[i].src.match(libFileName))
		{
			$_.base=scripts[i].src.replace(libFileName,"");
			break;
		}
	}
}
$setupBase();  //调用

var initEvents=new Array();  //加载页面时调用的语句
var scrollEvents=new Array();  //滚动页面时调用的语句
var resizeEvents=new Array();  //改变页面大小时调用的语句

//onLoad时要加载的方法，只有这样才能启动Frame的功能
function $init()
{
	//处理初始化的事件
	for(var i=0;i<initEvents.length;i++)
	{
		if(typeof(initEvents[i])=='function') initEvents[i]();
		else if(typeof(initEvents[i])=='string') eval(initEvents[i]);
	}

	//加上所有滚动事件的监听
	for(var i=0;i<scrollEvents.length;i++)
	{
		if($_.IE || $_.OE) window.attachEvent('onscroll',scrollEvents[i]);
		else window.addEventListener('scroll',scrollEvents[i],false);
	}

	//加上所有改变窗口大小事件的监听
	for(var i=0;i<resizeEvents.length;i++)
	{
		if($_.IE || $_.OE) window.attachEvent('onresize',resizeEvents[i]);
		else window.addEventListener('resize',resizeEvents[i],false);
	}
}


/*
增强的indexOf()，这个方法和通常的indexOf()的区别是当数组中没有要定位的元素时，会定位到最相近的元素的位置上
采用了折半法进行查找和定位，必须要是一个有序数组才能使用  */
Array.prototype.indexOfPro=function(str)
{
	var s=0;
	var e=this.length;
	return this._indexOfPro(s,e,str);
}

Array.prototype._indexOfPro=function(s,e,str)
{
	var m=Math.round((e+s)/2);
	$debug(m);

	if(m!=s && m!=e)
	{
		if(this[m]>=str && this[m-1]<str)
			return m;
		else
		{
			if(this[m]>=str)
				return this._indexOfPro(s,m,str);
			else
				return this._indexOfPro(m,e,str);
		}
	}

	return 0;
}


// html编码
String.prototype.htmlEncode=function()
{
	var s=this;
    s = s.replace(/&/g, "&amp;");
    s = s.replace(/</g, "&lt;");
    s = s.replace(/>/g, "&gt;");
    s = s.replace(/\"/g, "&quot;");
    s = s.replace(/\'/g, "&#34;");
	return s;
}

// js编码
String.prototype.jsEncode=function()
{
	var s=this;
    s = s.replace(/\\/g, "\\\\");
    s = s.replace(/\n/g, "\\n");
    s = s.replace(/\"/g, "\\\"");
    s = s.replace(/\'/g, "\\\'");
    return s;
}
